WebAssemblyã«ããã埪ç°åç §ã®æ€åºãšã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãæ·±ãæãäžããã¡ã¢ãªãªãŒã¯ãé²ãã倿§ãªãã©ãããã©ãŒã ã§ããã©ãŒãã³ã¹ãæé©åãããã¯ããã¯ãæ¢ããŸãã
WebAssembly GCïŒåŸªç°åç §ã®ãã³ããªã³ã°ã極ãã
WebAssembly (Wasm)ã¯ã髿§èœã§ããŒã¿ãã«ããã€å®å šãªã³ãŒãå®è¡ç°å¢ãæäŸããããšã§ããŠã§ãéçºã«é©åœããããããŸãããæè¿Wasmã«è¿œå ãããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒGCïŒã¯ãéçºè ã«æ°ããªå¯èœæ§ãéããC#ãJavaãKotlinãªã©ã®èšèªãæåã®ã¡ã¢ãªç®¡çã®ãªãŒããŒããããªãã«ãã©ãŠã¶å ã§çŽæ¥äœ¿çšã§ããããã«ããŸããããããGCã¯æ°ããªèª²é¡ãç¹ã«åŸªç°åç §ã®æ±ãã«ãããŠèª²é¡ãæèµ·ããŸãããã®èšäºã§ã¯ãWebAssembly GCã«ããã埪ç°åç §ãçè§£ããåŠçããããã®å æ¬çãªã¬ã€ããæäŸããã¢ããªã±ãŒã·ã§ã³ã®å ç¢æ§ãå¹çæ§ããããŠã¡ã¢ãªãªãŒã¯ããã®è§£æŸãä¿èšŒããŸãã
埪ç°åç §ãšã¯äœãïŒ
埪ç°åç §ïŒãµãŒãã¥ã©ãŒãªãã¡ã¬ã³ã¹ãšãåŒã°ããïŒã¯ã2ã€ä»¥äžã®ãªããžã§ã¯ããäºãã«åç §ãä¿æããéããã«ãŒãã圢æãããšãã«çºçããŸããèªåã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã䜿çšããã·ã¹ãã ã§ã¯ããããã®ãªããžã§ã¯ããã«ãŒãã»ããïŒã°ããŒãã«å€æ°ãã¹ã¿ãã¯ïŒããå°éäžèœã«ãªã£ãå Žåãã¬ããŒãžã³ã¬ã¯ã¿ã¯ããããååã§ãããã¡ã¢ãªãªãŒã¯ã«ã€ãªããå¯èœæ§ããããŸããããã¯ããµã€ã¯ã«å šäœãäºå®äžå€ç«ããŠããã«ãããããããGCã¢ã«ãŽãªãºã ããµã€ã¯ã«å ã®åãªããžã§ã¯ãããŸã åç §ãããŠãããšèªèããããã§ãã
æ¶ç©ºã®Wasm GCèšèªïŒJavaãC#ã®ãããªãªããžã§ã¯ãæåèšèªã®æŠå¿µã«äŒŒãŠããŸãïŒã§ã®ç°¡åãªäŸãèããŠã¿ãŸãããã
class Person {
String name;
Person friend;
}
Person alice = new Person("Alice");
Person bob = new Person("Bob");
alice.friend = bob;
bob.friend = alice;
// ãã®æç¹ã§ãAliceãšBobã¯äºãã«åç
§ãåã£ãŠããŸãã
alice = null;
bob = null;
// AliceãBobãçŽæ¥å°éå¯èœã§ã¯ãããŸãããããŸã äºãã«åç
§ãåã£ãŠããŸãã
// ããã埪ç°åç
§ã§ãããåçŽãªGCã§ã¯ããããåéã§ããªãå¯èœæ§ããããŸãã
ãã®ã·ããªãªã§ã¯ã`alice`ãš`bob`ã`null`ã«èšå®ãããåŸã§ããããããæããŠãã`Person`ãªããžã§ã¯ãã¯äºãã«åç §ãåã£ãŠãããããã¡ã¢ãªå ã«ååšãç¶ããŸããé©åãªåŠçããªããã°ãã¬ããŒãžã³ã¬ã¯ã¿ã¯ãã®ã¡ã¢ãªãè§£æŸã§ãããæéãšãšãã«ãªãŒã¯ãåŒãèµ·ããå¯èœæ§ããããŸãã
ãªãWebAssembly GCã«ãããŠåŸªç°åç §ã¯åé¡ãšãªãã®ãïŒ
埪ç°åç §ã¯ãããã€ãã®èŠå ã«ãããWebAssembly GCã«ãããŠç¹ã«åä»ãªåé¡ãšãªãåŸãŸãã
- éããããªãœãŒã¹ïŒ WebAssemblyã¯ããŠã§ããã©ãŠã¶ãçµã¿èŸŒã¿ã·ã¹ãã ãªã©ããªãœãŒã¹ãéãããç°å¢ã§å®è¡ãããããšããããããŸããã¡ã¢ãªãªãŒã¯ã¯ãããã©ãŒãã³ã¹ã®äœäžãã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ãã·ã¥ã«ããã«ã€ãªããå¯èœæ§ããããŸãã
- é·æéå®è¡ãããã¢ããªã±ãŒã·ã§ã³ïŒ ãŠã§ãã¢ããªã±ãŒã·ã§ã³ãç¹ã«ã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ïŒSPAïŒã¯ãé·æéã«ããã£ãŠå®è¡ãããããšããããŸããå°ããªã¡ã¢ãªãªãŒã¯ã§ãæéãšãšãã«èç©ããé倧ãªåé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
- çžäºéçšæ§ïŒ WebAssemblyã¯ãç¬èªã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¡ã«ããºã ãæã€JavaScriptã³ãŒããšå¯Ÿè©±ããããšããããããŸããããã2ã€ã®ã·ã¹ãã éã§ã¡ã¢ãªã®äžè²«æ§ã管çããããšã¯å°é£ãªå Žåãããã埪ç°åç §ã¯ãããããã«è€éã«ããŸãã
- ãããã°ã®è€éãïŒ åŸªç°åç §ãç¹å®ããããã°ããããšã¯ãç¹ã«å€§èŠæš¡ã§è€éãªã¢ããªã±ãŒã·ã§ã³ã§ã¯å°é£ãªå ŽåããããŸããåŸæ¥ã®ã¡ã¢ãªãããã¡ã€ãªã³ã°ããŒã«ã¯ãWasmç°å¢ã§ã¯ããã«å©çšã§ããªãã£ããã广çã§ãªãã£ããããå¯èœæ§ããããŸãã
WebAssembly GCã«ããã埪ç°åç §ã®å¯ŸåŠæŠç¥
幞ããªããšã«ãWebAssembly GCã¢ããªã±ãŒã·ã§ã³ã§åŸªç°åç §ãé²ãã管çããããã«æ¡çšã§ããæŠç¥ãããã€ããããŸãããããã«ã¯ä»¥äžãå«ãŸããŸãã
1. ãããã埪ç°ãäœæããªã
埪ç°åç §ã«å¯ŸåŠããæã广çãªæ¹æ³ã¯ãããããããããäœæããªãããšã§ããããã«ã¯ãæ éãªèšèšãšã³ãŒãã£ã³ã°ã®å®è·µãå¿ èŠã§ãã以äžã®ã¬ã€ãã©ã€ã³ãæ€èšããŠãã ããã
- ããŒã¿æ§é ã®èŠçŽãïŒ ããŒã¿æ§é ãåæããŠã埪ç°åç §ã®æœåšçãªåå ãç¹å®ããŸãããµã€ã¯ã«ãåé¿ããããã«åèšèšã§ããŸããïŒ
- æææš©ã®ã»ãã³ãã£ã¯ã¹ïŒ ãªããžã§ã¯ãã®æææš©ã»ãã³ãã£ã¯ã¹ãæç¢ºã«å®çŸ©ããŸããã©ã®ãªããžã§ã¯ããä»ã®ãªããžã§ã¯ãã®ã©ã€ããµã€ã¯ã«ã管çãã責任ãè² ããŸããïŒãªããžã§ã¯ãã察çãªæææš©ãæã¡ãäºãã«åç §ãåãç¶æ³ãé¿ããŠãã ããã
- 倿Žå¯èœãªç¶æ ã®æå°åïŒ ãªããžã§ã¯ãã®å€æŽå¯èœãªç¶æ ã®éãæžãããŸããäžå€ãªããžã§ã¯ãã¯ãäœæåŸã«äºããæãããã«å€æŽã§ããªãããã埪ç°ãäœæã§ããŸããã
äŸãã°ãåæ¹åã®é¢ä¿ã®ä»£ããã«ãé©åãªå Žåã¯åæ¹åã®é¢ä¿ã䜿çšããããšãæ€èšããŠãã ãããäž¡æ¹åã«ããã²ãŒãããå¿ èŠãããå Žåã¯ãçŽæ¥ã®ãªããžã§ã¯ãåç §ã®ä»£ããã«ãå¥ã®ã€ã³ããã¯ã¹ãŸãã¯ã«ãã¯ã¢ããããŒãã«ãç¶æããŸãã
2. 匱ãåç § (Weak References)
匱ãåç §ã¯ã埪ç°åç §ãæã¡åãããã®åŒ·åãªã¡ã«ããºã ã§ãã匱ãåç §ãšã¯ããªããžã§ã¯ããä»ã®æ¹æ³ã§å°éäžèœã«ãªã£ãå Žåã«ãã¬ããŒãžã³ã¬ã¯ã¿ããã®ãªããžã§ã¯ããååããã®ã劚ããªãåç §ã§ããã¬ããŒãžã³ã¬ã¯ã¿ããªããžã§ã¯ããååãããšã匱ãåç §ã¯èªåçã«ã¯ãªã¢ãããŸãã
ã»ãšãã©ã®çŸä»£çãªèšèªã¯ã匱ãåç §ããµããŒãããŠããŸããäŸãã°ãJavaã§ã¯`java.lang.ref.WeakReference`ã¯ã©ã¹ã䜿çšã§ããŸããåæ§ã«ãC#ã¯`System.WeakReference`ã¯ã©ã¹ãæäŸããŸããWebAssembly GCãã¿ãŒã²ãããšããèšèªããåæ§ã®ã¡ã«ããºã ãæã€å¯èœæ§ãé«ãã§ãã
匱ãåç §ã广çã«äœ¿çšããã«ã¯ãé¢ä¿ã®éèŠåºŠã®äœãåŽãç¹å®ãããã®ãªããžã§ã¯ãããããäžæ¹ã®ãªããžã§ã¯ããžã®åŒ±ãåç §ã䜿çšããŸããããã«ãããéèŠåºŠã®äœããªããžã§ã¯ããäžèŠã«ãªã£ãå Žåãã¬ããŒãžã³ã¬ã¯ã¿ã¯ãããååãããµã€ã¯ã«ãæã¡åãããšãã§ããŸãã
åã®`Person`ã®äŸãèããŠã¿ãŸãããããã人ã®å人ã远跡ããããšããå人ã誰ãšåéã§ããããç¥ãããšãããéèŠã§ããå Žåã`Person`ã¯ã©ã¹ãããã®å人ãã¡ã衚ã`Person`ãªããžã§ã¯ããžã®åŒ±ãåç §ã䜿çšã§ããŸãã
class Person {
String name;
WeakReference<Person> friend;
}
Person alice = new Person("Alice");
Person bob = new Person("Bob");
alice.friend = new WeakReference<Person>(bob);
bob.friend = new WeakReference<Person>(alice);
// ãã®æç¹ã§ãAliceãšBobã¯åŒ±ãåç
§ãä»ããŠäºãã«åç
§ãåã£ãŠããŸãã
alice = null;
bob = null;
// AliceãBobãçŽæ¥å°éå¯èœã§ã¯ãªãã匱ãåç
§ã¯ããããåéãããã®ã劚ããŸããã
// ããã§GCã¯AliceãšBobãå æããŠããã¡ã¢ãªãè§£æŸã§ããŸãã
ã°ããŒãã«ãªæèã§ã®äŸïŒ WebAssemblyã䜿çšããŠæ§ç¯ããããœãŒã·ã£ã«ãããã¯ãŒãã³ã°ã¢ããªã±ãŒã·ã§ã³ãæ³åããŠã¿ãŠãã ãããåãŠãŒã¶ãŒãããã¡ã€ã«ã¯ãã©ãã¯ãŒã®ãªã¹ããä¿åãããããããŸããããŠãŒã¶ãŒãäºãã«ãã©ããŒãåãå Žåã«åŸªç°åç §ãé¿ããããããã©ãã¯ãŒãªã¹ãã¯åŒ±ãåç §ã䜿çšã§ããŸããããã«ããããŠãŒã¶ãŒã®ãããã¡ã€ã«ããã¯ãã¢ã¯ãã£ãã«è¡šç€ºãŸãã¯åç §ãããªããªã£ãå Žåãä»ã®ãŠãŒã¶ãŒããŸã ãã©ããŒããŠããŠããã¬ããŒãžã³ã¬ã¯ã¿ã¯ãããååã§ããŸãã
3. ãã¡ã€ãã©ã€ãŒãŒã·ã§ã³ã¬ãžã¹ã㪠(Finalization Registry)
ãã¡ã€ãã©ã€ãŒãŒã·ã§ã³ã¬ãžã¹ããªã¯ããªããžã§ã¯ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããçŽåã«ã³ãŒããå®è¡ããã¡ã«ããºã ãæäŸããŸããããã¯ããã¡ã€ãã©ã€ã¶ã§æç€ºçã«åç §ãã¯ãªã¢ããããšã«ãã£ãŠåŸªç°åç §ãæã¡åãããã«äœ¿çšã§ããŸããããã¯ä»ã®èšèªã®ãã¹ãã©ã¯ã¿ããã¡ã€ãã©ã€ã¶ã«äŒŒãŠããŸãããã³ãŒã«ããã¯ã®ããã®æç€ºçãªç»é²ãå¿ èŠã§ãã
ãã¡ã€ãã©ã€ãŒãŒã·ã§ã³ã¬ãžã¹ããªã¯ããªãœãŒã¹ã®è§£æŸã埪ç°åç §ã®åæãªã©ã®ã¯ãªãŒã³ã¢ããæäœãå®è¡ããããã«äœ¿çšã§ããŸãããã ãããã¡ã€ãã©ã€ãŒãŒã·ã§ã³ã¯ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããã»ã¹ã«ãªãŒããŒãããã远å ããéæ±ºå®çãªåäœãå°å ¥ããå¯èœæ§ããããããæ éã«äœ¿çšããããšãéèŠã§ããç¹ã«ããµã€ã¯ã«ãæã¡åãããã®*å¯äžã®*ã¡ã«ããºã ãšããŠãã¡ã€ãã©ã€ãŒãŒã·ã§ã³ã«äŸåãããšãã¡ã¢ãªè§£æŸã®é å»¶ãäºæž¬äžå¯èœãªã¢ããªã±ãŒã·ã§ã³ã®åäœã«ã€ãªããå¯èœæ§ããããŸããä»ã®ãã¯ããã¯ã䜿çšãããã¡ã€ãã©ã€ãŒãŒã·ã§ã³ã¯æåŸã®ææ®µãšããŠäœ¿çšããã®ãè¯ãã§ãããã
äŸïŒ
// æ¶ç©ºã®WASM GCã³ã³ããã¹ããæ³å®
let registry = new FinalizationRegistry(heldValue => {
console.log("ãªããžã§ã¯ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããããšããŠããŸã", heldValue);
// heldValueã¯åŸªç°åç
§ãæã¡åãã³ãŒã«ããã¯ã§ããå¯èœæ§ããããŸãã
heldValue();
});
let obj1 = {};
let obj2 = {};
obj1.ref = obj2;
obj2.ref = obj1;
// 埪ç°ãæã¡åãããã®ã¯ãªãŒã³ã¢ãã颿°ãå®çŸ©
function cleanup() {
obj1.ref = null;
obj2.ref = null;
console.log("埪ç°åç
§ãæã¡åãããŸãã");
}
registry.register(obj1, cleanup);
obj1 = null;
obj2 = null;
// ãã°ããããŠã¬ããŒãžã³ã¬ã¯ã¿ãå®è¡ããããšãobj1ãåéãããåã«cleanup()ãåŒã³åºãããŸãã
4. æåã¡ã¢ãªç®¡çïŒçްå¿ã®æ³šæãæã£ãŠäœ¿çšïŒ
Wasm GCã®ç®æšã¯ã¡ã¢ãªç®¡çãèªååããããšã§ãããéåžžã«ç¹å®ã®ã·ããªãªã§ã¯ãæåã¡ã¢ãªç®¡çãå¿ èŠã«ãªãå ŽåããããŸããããã¯éåžžãWasmã®ãªãã¢ã¡ã¢ãªãçŽæ¥äœ¿çšããã¡ã¢ãªãæç€ºçã«å²ãåœãŠããã³è§£æŸããããšãå«ã¿ãŸãããããããã®ã¢ãããŒãã¯éåžžã«ãšã©ãŒãçºçãããããä»ã®ãã¹ãŠã®ãªãã·ã§ã³ãå°œããå Žåã®æåŸã®ææ®µãšããŠã®ã¿æ€èšãã¹ãã§ãã
æåã¡ã¢ãªç®¡çã䜿çšããå Žåã¯ãã¡ã¢ãªãªãŒã¯ããã³ã°ãªã³ã°ãã€ã³ã¿ãããã³ãã®ä»ã®äžè¬çãªèœãšã穎ãé¿ããããã«çްå¿ã®æ³šæãæã£ãŠãã ãããé©åãªã¡ã¢ãªå²ãåœãŠããã³è§£æŸã«ãŒãã³ã䜿çšããã³ãŒããå³å¯ã«ãã¹ãããŠãã ããã
æåã¡ã¢ãªç®¡çãå¿ èŠã«ãªãå¯èœæ§ãããã·ããªãªïŒãã ããããã§ãæ éã«è©äŸ¡ããå¿ èŠããããŸãïŒã以äžã«ç€ºããŸãã
- éåžžã«ããã©ãŒãã³ã¹ãéèŠãªã»ã¯ã·ã§ã³ïŒ ã³ãŒãã«éåžžã«ããã©ãŒãã³ã¹ã«ææãªã»ã¯ã·ã§ã³ããããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®ãªãŒããŒãããã蚱容ã§ããªãå Žåã¯ãæåã¡ã¢ãªç®¡çãæ€èšãããããããŸããããã ããããã©ãŒãã³ã¹ã®åäžã远å ãããè€éããšãªã¹ã¯ãäžåãããšã確èªããããã«ãã³ãŒããæ éã«ãããã¡ã€ãªã³ã°ããŠãã ããã
- æ¢åã®C/C++ã©ã€ãã©ãªãšã®é£æºïŒ æåã¡ã¢ãªç®¡çã䜿çšããæ¢åã®C/C++ã©ã€ãã©ãªãšçµ±åããŠããå Žåã¯ãäºææ§ã確ä¿ããããã«Wasmã³ãŒãã§æåã¡ã¢ãªç®¡çã䜿çšããå¿ èŠããããããããŸããã
éèŠãªæ³šæïŒ GCç°å¢ã§ã®æåã¡ã¢ãªç®¡çã¯ãè€éãã®å±€ãå€§å¹ ã«è¿œå ããŸããäžè¬çã«ã¯ãGCãæŽ»çšãããŸããµã€ã¯ã«ãæã¡åããã¯ããã¯ã«éäžããããšãæšå¥šãããŸãã
5. ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãã³ã
äžéšã®ã¬ããŒãžã³ã¬ã¯ã¿ã¯ããã®åäœã«åœ±é¿ãäžããããšãã§ãããã³ããæç€ºãæäŸããŸãããããã®ãã³ãã¯ãGCãç¹å®ã®ãªããžã§ã¯ããã¡ã¢ãªé åãããç©æ¥µçã«åéããããã«ä¿ãããã«äœ¿çšã§ããŸãããã ãããããã®ãã³ãã®å©çšå¯èœæ§ãšæå¹æ§ã¯ãç¹å®ã®GCå®è£ ã«ãã£ãŠç°ãªããŸãã
äŸãã°ãäžéšã®GCã§ã¯ããªããžã§ã¯ãã®æåŸ ããã寿åœãæå®ã§ããŸããæåŸ ããã寿åœãçããªããžã§ã¯ãã¯ããé »ç¹ã«åéã§ããã¡ã¢ãªãªãŒã¯ã®å¯èœæ§ãæžãããŸããããããé床ã«ç©æ¥µçãªåéã¯CPU䜿çšçãå¢å ãããå¯èœæ§ãããããããããã¡ã€ãªã³ã°ãéèŠã§ãã
å©çšå¯èœãªãã³ããšãããã广çã«äœ¿çšããæ¹æ³ã«ã€ããŠã¯ãç¹å®ã®Wasm GCå®è£ ã®ããã¥ã¡ã³ããåç §ããŠãã ããã
6. ã¡ã¢ãªãããã¡ã€ãªã³ã°ãšåæããŒã«
广çãªã¡ã¢ãªãããã¡ã€ãªã³ã°ãšåæããŒã«ã¯ã埪ç°åç §ãç¹å®ããããã°ããããã«äžå¯æ¬ ã§ãããããã®ããŒã«ã¯ãã¡ã¢ãªäœ¿çšéã远跡ããåéãããŠããªããªããžã§ã¯ããç¹å®ãããªããžã§ã¯ãã®é¢ä¿ãèŠèŠåããã®ã«åœ¹ç«ã¡ãŸãã
æ®å¿µãªãããWebAssembly GCçšã®ã¡ã¢ãªãããã¡ã€ãªã³ã°ããŒã«ã®å©çšå¯èœæ§ã¯ãŸã éãããŠããŸããããããWasmãšã³ã·ã¹ãã ãæçããã«ã€ããŠãããå€ãã®ããŒã«ãå©çšå¯èœã«ãªãå¯èœæ§ãé«ãã§ãã以äžã®æ©èœãæäŸããããŒã«ãæ¢ããŠãã ããã
- ããŒãã¹ãããã·ã§ããïŒ ããŒãã®ã¹ãããã·ã§ããããã£ããã£ããŠããªããžã§ã¯ãã®ååžãåæããæœåšçãªã¡ã¢ãªãªãŒã¯ãç¹å®ããŸãã
- ãªããžã§ã¯ãã°ã©ãã®èŠèŠåïŒ ãªããžã§ã¯ãã®é¢ä¿ãèŠèŠåããŠã埪ç°åç §ãç¹å®ããŸãã
- ã¡ã¢ãªã¢ãã±ãŒã·ã§ã³ãã©ããã³ã°ïŒ ã¡ã¢ãªã®å²ãåœãŠãšè§£æŸã远跡ããŠããã¿ãŒã³ãšæœåšçãªåé¡ãç¹å®ããŸãã
- ãããã¬ãšã®çµ±åïŒ ãããã¬ãšçµ±åããŠãã³ãŒããã¹ãããå®è¡ããå®è¡æã®ã¡ã¢ãªäœ¿çšéãæ€æ»ããŸãã
å°çšã®Wasm GCãããã¡ã€ãªã³ã°ããŒã«ããªãå Žåã§ããæ¢åã®ãã©ãŠã¶éçºè ããŒã«ã掻çšããŠã¡ã¢ãªäœ¿çšéã«é¢ããæŽå¯ãåŸãããšãã§ããå ŽåããããŸããäŸãã°ãChrome DevToolsã®ã¡ã¢ãªããã«ã䜿çšããŠãã¡ã¢ãªå²ãåœãŠã远跡ããæœåšçãªã¡ã¢ãªãªãŒã¯ãç¹å®ã§ããŸãã
7. ã³ãŒãã¬ãã¥ãŒãšãã¹ã
宿çãªã³ãŒãã¬ãã¥ãŒãšåŸ¹åºçãªãã¹ãã¯ã埪ç°åç §ãé²ããæ€åºããããã«äžå¯æ¬ ã§ããã³ãŒãã¬ãã¥ãŒã¯åŸªç°åç §ã®æœåšçãªåå ãç¹å®ããã®ã«åœ¹ç«ã¡ããã¹ãã¯éçºäžã«ã¯æããã«ãªããªãå¯èœæ§ã®ããã¡ã¢ãªãªãŒã¯ãçºèŠããã®ã«åœ¹ç«ã¡ãŸãã
以äžã®ãã¹ãæŠç¥ãæ€èšããŠãã ããã
- åäœãã¹ãïŒ ã¢ããªã±ãŒã·ã§ã³ã®åã ã®ã³ã³ããŒãã³ããã¡ã¢ãªããªãŒã¯ããŠããªãããšã確èªããããã®åäœãã¹ããäœæããŸãã
- çµ±åãã¹ãïŒ ã¢ããªã±ãŒã·ã§ã³ã®ç°ãªãã³ã³ããŒãã³ããæ£ããçžäºäœçšãã埪ç°åç §ãäœæããªãããšã確èªããããã®çµ±åãã¹ããäœæããŸãã
- è² è·ãã¹ãïŒ çŸå®çãªäœ¿çšã·ããªãªãã·ãã¥ã¬ãŒãããé«è² è·äžã§ã®ã¿çºçããå¯èœæ§ã®ããã¡ã¢ãªãªãŒã¯ãç¹å®ããããã«è² è·ãã¹ããå®è¡ããŸãã
- ã¡ã¢ãªãªãŒã¯æ€åºããŒã«ïŒ ã¡ã¢ãªãªãŒã¯æ€åºããŒã«ã䜿çšããŠãã³ãŒãå ã®ã¡ã¢ãªãªãŒã¯ãèªåçã«ç¹å®ããŸãã
WebAssembly GC埪ç°åç §ç®¡çã®ãã¹ããã©ã¯ãã£ã¹
èŠçŽãããšãWebAssembly GCã¢ããªã±ãŒã·ã§ã³ã§åŸªç°åç §ã管çããããã®ãã¹ããã©ã¯ãã£ã¹ã¯æ¬¡ã®ãšããã§ãã
- äºé²ãåªå ããïŒ ãããã埪ç°åç §ãäœæããªãããã«ããŒã¿æ§é ãšã³ãŒããèšèšããŸãã
- 匱ãåç §ãæŽ»çšããïŒ çŽæ¥ã®åç §ãäžèŠãªå Žåã¯ã匱ãåç §ã䜿çšããŠãµã€ã¯ã«ãæã¡åããŸãã
- ãã¡ã€ãã©ã€ãŒãŒã·ã§ã³ã¬ãžã¹ããªãè³¢æã«å©çšããïŒ äžå¯æ¬ ãªã¯ãªãŒã³ã¢ããã¿ã¹ã¯ã«ã¯ãã¡ã€ãã©ã€ãŒãŒã·ã§ã³ã¬ãžã¹ããªã䜿çšããŸããããµã€ã¯ã«ãæã¡åãäž»èŠãªææ®µãšããŠããã«äŸåããããšã¯é¿ããŸãã
- æåã¡ã¢ãªç®¡çã«ã¯çްå¿ã®æ³šæãæãïŒ çµ¶å¯Ÿã«å¿ èŠãªå Žåã«ã®ã¿æåã¡ã¢ãªç®¡çã«é Œããã¡ã¢ãªã®å²ãåœãŠãšè§£æŸãæ éã«ç®¡çããŸãã
- ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãã³ããæŽ»çšããïŒ GCã®åäœã«åœ±é¿ãäžããããã«ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãã³ãã調æ»ããŠå©çšããŸãã
- ã¡ã¢ãªãããã¡ã€ãªã³ã°ããŒã«ã«æè³ããïŒ ã¡ã¢ãªãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠã埪ç°åç §ãç¹å®ããããã°ããŸãã
- 峿 Œãªã³ãŒãã¬ãã¥ãŒãšãã¹ãã宿œããïŒ å®æçãªã³ãŒãã¬ãã¥ãŒãšåŸ¹åºçãªãã¹ãã宿œããŠãã¡ã¢ãªãªãŒã¯ãé²ããæ€åºããŸãã
çµè«
埪ç°åç §ã®åŠçã¯ãå ç¢ã§å¹ççãªWebAssembly GCã¢ããªã±ãŒã·ã§ã³ãéçºããäžã§éèŠãªåŽé¢ã§ãã埪ç°åç §ã®æ§è³ªãçè§£ãããã®èšäºã§æŠèª¬ããæŠç¥ãæ¡çšããããšã§ãéçºè ã¯ã¡ã¢ãªãªãŒã¯ãé²ããããã©ãŒãã³ã¹ãæé©åããWasmã¢ããªã±ãŒã·ã§ã³ã®é·æçãªå®å®æ§ã確ä¿ã§ããŸããWebAssemblyãšã³ã·ã¹ãã ãé²åãç¶ããã«ã€ããŠãGCã¢ã«ãŽãªãºã ãšããŒã«ã®ãããªã鲿©ãæåŸ ãããã¡ã¢ãªã广çã«ç®¡çããããšãããã«å®¹æã«ãªãã§ããããéèŠãªã®ã¯ãæ å ±ãåžžã«ææ¡ããWebAssembly GCã®ããã³ã·ã£ã«ãæå€§éã«æŽ»çšããããã®ãã¹ããã©ã¯ãã£ã¹ãæ¡çšããããšã§ãã